package thread.threadpool.example2;


import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @Description: 关闭线程方法：shutdown和shutdownNow的区别
 * shutdown()：仅仅是不再接受新的任务，以前的任务还会继续执行
 * shutdownNow()：立刻关闭线程池，如果线程池中还有缓存的任务没有执行，则取消执行，并返回这些任务
 * @date: 2023/1/30 17:36
 * @author: Huangjunjie
 * @since JDK 1.8
 */
public class ExecuTorsTest4 {
    public static void main(String[] args) {
//        func1();
        func2();
    }

    /**
     * 使用 newSingleThreadExecutor 方法得到线程池对象
     */
    private static void func1() {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            //执行线程
            executorService.submit(new MyRunnable(i));
        }
        //销毁线程池（不建议使用）
        //关闭线程池，仅仅是不再接受新的任务，以前的任务还会继续执行
        executorService.shutdown();

        //executorService.submit(new MyRunnable(99));
    }

    /**
     * 使用 newSingleThreadExecutor 方法得到线程池对象
     * shutdownNow()关闭线程池
     */
    private static void func2() {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            //执行线程
            executorService.submit(new MyRunnable(i));
        }
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        //销毁线程池（不建议使用）
        ////立刻关闭线程池，不再接受新的任务，如果线程池中还有缓存的任务没有执行，则取消执行，并返回这些任务
        List<Runnable> runnables = executorService.shutdownNow();
        System.out.println(runnables.get(0).toString());
//        executorService.submit(new MyRunnable(99));
    }
}
